package com.cloudz.iptv.audio;

import android.util.Log;

import com.alibaba.idst.util.NlsClient;
import com.alibaba.idst.util.SpeechSynthesizer;
import com.alibaba.idst.util.SpeechSynthesizerCallback;

/**
 * @File Name: com.cloudz.iptv.audio
 * @Author: YJ //作者及
 * @Date: 2019/3/22 12:35 AM//完成日期
 * @Description: // 描述
 * @Version: v0.0.1 // 版本信息
 * @Function List: // 主要函数及其功能
 * @Others: // 其它内容的说明
 * @History: // 历史修改记录
 */
public class AliTss
{
    private static final String TAG = "AliSpeechDemo";

    NlsClient client;

    private SpeechSynthesizer speechSynthesizer;

    private static AudioPlayer audioPlayer;

    private static AliTss aliTss;

    public static AliTss getInstance()
    {
        if (aliTss == null)
        {
            synchronized (AliTss.class)
            {
                if (aliTss == null)
                {
                    aliTss = new AliTss();
                }
            }
        }
        return aliTss;
    }

    public AliTss()
    {
        // 第一步，创建client实例，client只需要创建一次，可以用它多次创建synthesizer
        this.client = new NlsClient();
        this.audioPlayer = new AudioPlayer();
    }

    /**
     * 语音合成
     */
    public void startSynthesizer(String token, String text)
    {

        // 第二步，定义语音合成回调类
        SpeechSynthesizerCallback callback = new MyCallback();
        // 第三步，创建语音合成对象
        speechSynthesizer = client.createSynthesizerRequest(callback);
        // 第四步，设置token和appkey
        // Token有有效期，请使用https://help.aliyun.com/document_detail/72153.html 动态生成token
        speechSynthesizer.setToken(token);
        // 请使用阿里云语音服务管控台(https://nls-portal.console.aliyun.com/)生成您的appkey
        speechSynthesizer.setAppkey("p6gYrqd4NlwwoeFk");

        // 第五步，设置相关参数，以下选项都会改变最终合成的语音效果，可以按文档调整试听效果
        String chosenVoice = SpeechSynthesizer.VOICE_SIQI;
        int speechRate = 1;
        // 设置人声
        Log.i(TAG, "Set chosen voice " + chosenVoice);
        speechSynthesizer.setVoice(chosenVoice);
        // 设置语速
        Log.i(TAG, "User set speechRate " + speechRate);
        speechSynthesizer.setSpeechRate(speechRate);
        // 设置要转为语音的文本
        speechSynthesizer.setText(text);
        // 设置语音数据采样率
        speechSynthesizer.setSampleRate(SpeechSynthesizer.SAMPLE_RATE_16K);
        // 设置语音编码，pcm编码可以直接用audioTrack播放，其他编码不行
        speechSynthesizer.setFormat(SpeechSynthesizer.FORMAT_PCM);
        // 设置音量
         speechSynthesizer.setVolume(50);
        // 设置语速
         speechSynthesizer.setSpeechRate(0);
        // 设置语调
         speechSynthesizer.setPitchRate(0);

        // 第六步，开始合成
        if (speechSynthesizer.start() < 0)
        {
            speechSynthesizer.stop();
            return;
        }
        Log.d(TAG, "speechSynthesizer start done");
        // 第八步，结束合成
        speechSynthesizer.stop();

    }

    private static class MyCallback implements SpeechSynthesizerCallback
    {

        boolean playing = false;

        // 语音合成开始的回调
        @Override
        public void onSynthesisStarted(String msg, int code)
        {
            Log.d(TAG, "OnSynthesisStarted " + msg + ": " + String.valueOf(code));
        }

        // 第七步，获取音频数据的回调，在这里把音频写入播放器
        @Override
        public void onBinaryReceived(byte[] data, int code)
        {
            Log.i(TAG, "binary received length: " + data.length);
            audioPlayer.setAudioData(data);
            //GSYVideoManager.instance().setNeedMute(false);
        }

        // 语音合成完成的回调，在这里关闭播放器
        @Override
        public void onSynthesisCompleted(final String msg, int code)
        {
            Log.d(TAG, "OnSynthesisCompleted " + msg + ": " + String.valueOf(code));
        }

        // 调用失败的回调
        @Override
        public void onTaskFailed(String msg, int code)
        {
            Log.d(TAG, "OnTaskFailed " + msg + ": " + String.valueOf(code));
        }

        // 连接关闭的回调
        @Override
        public void onChannelClosed(String msg, int code)
        {
            Log.d(TAG, "OnChannelClosed " + msg + ": " + String.valueOf(code));
        }
    }
}
